package global

import (
	"bytes"
	"fmt"
	"io"
	"os"
	"path/filepath"
	"time"

	"github.com/sirupsen/logrus"
)

// 初始化log
func InitLogger() error {
	logrusLogLevel, err := logrus.ParseLevel("debug")
	if err != nil {
		return err
	}
	// 输出位置
	logrus.SetOutput(io.MultiWriter(LogFile("kitLog/"), os.Stdout))
	// 日志等级
	logrus.SetLevel(logrusLogLevel)
	// 记录器是否启用
	logrus.SetReportCaller(true)
	// 自定义格式
	logrus.SetFormatter(&MyFormatter{})
	return nil
}

// 日志输出位置
func LogFile(fileDir string) (pf *os.File) {
	fileName := time.Now().Format("2006-01-02")
	fileName += ".log"
	filePath := filepath.Join(fileDir, fileName)
	pf, _ = os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	return
}

type MyFormatter struct{}

// 重写并且自定义自己的方法
func (m *MyFormatter) Format(entry *logrus.Entry) ([]byte, error) {
	var b *bytes.Buffer
	if entry.Buffer != nil {
		b = entry.Buffer
	} else {
		b = &bytes.Buffer{}
	}

	timestamp := entry.Time.Format("2006-01-02 15:04:05")
	var newLog string

	//HasCaller()为true才会有调用信息
	if entry.HasCaller() {
		fName := filepath.Base(entry.Caller.File)
		newLog = fmt.Sprintf(
			"%c[1;44;30m[%.4s]%c[0m [%s] %c[1;42;30m[%s:%d]%c[0m  %s",
			0x1B, entry.Level, 0x1B, /* 日志等级 */
			timestamp,                            /* 时间戳 */
			0x1B, fName, entry.Caller.Line, 0x1B, /* 哪一行 */
			entry.Message) /* 日志输出信息 */
	} else {
		newLog = fmt.Sprintf("%c[1;43;30m[%.4s]%c[0m [%s] %s", 0x1B, entry.Level, 0x1B, timestamp, entry.Message)
	}
	if len(entry.Data) > 0 {
		newLog = fmt.Sprintf("%s ++ %v", newLog, entry.Data)
	}
	newLog += "\n"

	b.WriteString(newLog)
	return b.Bytes(), nil
}
